1,body只能读一次,解决办法是存一个变量中,读完再写回去。
2,body close就不能再打开。永久关闭不能访问
网络请求和手动创建的 Body 的区别
| 特性 |
网络请求的 Body |
手动创建的 Body |
| 底层实现 |
网络连接(net.Conn 的封装) |
内存数据(如 bytes.Buffer) |
| 数据来源 |
客户端通过网络传输 |
本地内存中的数据 |
| 是否只能读取一次 |
是(流式数据,读取后消耗) |
否(静态数据,可以多次读取) |
| 是否需要关闭 |
是(需要释放网络连接) |
取决于实现(如 io.NopCloser 不需要) |
当客户端发送 HTTP 请求时,服务器端的 http.Request.Body 是一个 io.ReadCloser,它通常封装了客户端的请求体数据。这种 Body 有以下特点:
- 占用网络资源:
它背后是一个活跃的网络连接,需要显式关闭以释放资源(如文件描述符、TCP 连接等)。
- 必须关闭:
如果不关闭 Body,会导致资源泄漏(如连接未释放),可能会耗尽系统的文件描述符或网络连接数。
- 只能读取一次:
网络流是单向的,读取后数据会被消耗,无法再次读取。
当你手动构造一个 http.Request 时,Body 通常是一个本地的 io.Reader(如 bytes.Buffer、strings.Reader 或通过 io.NopCloser 包装的 io.Reader)。这种 Body 有以下特点:
- 不占用网络资源:
它只是一个内存中的数据结构,不涉及网络连接或文件描述符。
- 不需要显式关闭(取决于实现):
如果 Body 是通过 io.NopCloser 包装的,Close() 是空操作,不需要显式关闭。
如果 Body 是一个需要释放资源的类型(如 os.File),则需要显式关闭。
- 可以多次读取:
如果 Body 是基于 bytes.Buffer 或 strings.Reader 的,可以多次读取(前提是未调用 Close())。
当客户端发送 HTTP 请求时,服务器端的 http.Request.Body 是通过网络传输的数据流。它的底层实现通常是一个网络连接(如 net.Conn 的封装)。这种 Body 有以下特点:
底层实现
- 数据是通过网络流式传输的,底层是一个
net.Conn(TCP 连接)。
- 数据是实时读取的,读取后会被消耗,无法再次读取。
为什么只能读取一次?
- 流式传输:
网络数据是流式的,数据从客户端传输到服务器端是一次性的。读取后,数据会被从缓冲区中移除,无法再次读取。
- 资源管理:
网络连接是有限的资源,读取完成后需要关闭以释放连接。
「三年博客,如果觉得我的文章对您有用,请帮助本站成长」
共有 0 - golang r *http.Request 和 r *http.Response